home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / dev / gg / ncurses-5.3.lha / ncurses-5.3 / ncurses / widechar / lib_cchar.c < prev    next >
C/C++ Source or Header  |  2002-10-24  |  4KB  |  115 lines

  1. /****************************************************************************
  2.  * Copyright (c) 2001,2002 Free Software Foundation, Inc.                   *
  3.  *                                                                          *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a  *
  5.  * copy of this software and associated documentation files (the            *
  6.  * "Software"), to deal in the Software without restriction, including      *
  7.  * without limitation the rights to use, copy, modify, merge, publish,      *
  8.  * distribute, distribute with modifications, sublicense, and/or sell       *
  9.  * copies of the Software, and to permit persons to whom the Software is    *
  10.  * furnished to do so, subject to the following conditions:                 *
  11.  *                                                                          *
  12.  * The above copyright notice and this permission notice shall be included  *
  13.  * in all copies or substantial portions of the Software.                   *
  14.  *                                                                          *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
  16.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
  17.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
  18.  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
  19.  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
  20.  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
  21.  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
  22.  *                                                                          *
  23.  * Except as contained in this notice, the name(s) of the above copyright   *
  24.  * holders shall not be used in advertising or otherwise to promote the     *
  25.  * sale, use or other dealings in this Software without prior written       *
  26.  * authorization.                                                           *
  27.  ****************************************************************************/
  28.  
  29. /*
  30. **    lib_cchar.c
  31. **
  32. **    The routines setcchar() and getcchar().
  33. **
  34. */
  35.  
  36. #include <curses.priv.h>
  37.  
  38. MODULE_ID("$Id: lib_cchar.c,v 1.6 2002/08/10 22:27:37 tom Exp $")
  39.  
  40. /* 
  41.  * The SuSv2 description leaves some room for interpretation.  We'll assume wch
  42.  * is L'\0' terminated, contains at most one character with strictly positive
  43.  * width, which must be the first, and contains no characters of negative
  44.  * width.
  45.  */
  46. NCURSES_EXPORT(int)
  47. setcchar(cchar_t * wcval, const wchar_t * wch, const attr_t attrs,
  48.      short color_pair, const void *opts)
  49. {
  50.     int i;
  51.     int len;
  52.     int code = OK;
  53.  
  54.     TR(TRACE_CCALLS, (T_CALLED("setcchar(%p,%s,%ld,%d,%p)"),
  55.               wcval, _nc_viswbuf(wch), attrs, color_pair, opts));
  56.  
  57.     if (opts != NULL || (len = wcslen(wch)) > CCHARW_MAX
  58.     || (len > 0 && wcwidth(wch[0]) < 0)) {
  59.     code = ERR;
  60.     } else {
  61.  
  62.     for (i = 1; i < len; ++i) {
  63.         if (wcwidth(wch[i]) != 0) {
  64.         code = ERR;
  65.         break;
  66.         }
  67.     }
  68.  
  69.     if (code != ERR) {
  70.         memset(wcval, 0, sizeof(*wcval));
  71.  
  72.         if (len != 0) {
  73.         SetAttr(*wcval, attrs | color_pair);
  74.         memcpy(&wcval->chars, wch, len * sizeof(wchar_t));
  75.         TR(TRACE_CCALLS, ("copy %d wchars, first is %s", len,
  76.                   _tracecchar_t(wcval)));
  77.         }
  78.     }
  79.     }
  80.  
  81.     TR(TRACE_CCALLS, (T_RETURN("%d"), code));
  82.     return (code);
  83. }
  84.  
  85. NCURSES_EXPORT(int)
  86. getcchar(const cchar_t * wcval, wchar_t * wch, attr_t * attrs,
  87.      short *color_pair, void *opts)
  88. {
  89.     wchar_t *wp;
  90.     int len;
  91.     int code = ERR;
  92.  
  93.     TR(TRACE_CCALLS, (T_CALLED("getcchar(%p,%p,%p,%p,%p)"),
  94.               wcval, wch, attrs, color_pair, opts));
  95.  
  96.     if (opts == NULL) {
  97.     len = (wp = wmemchr(wcval->chars, L'\0', CCHARW_MAX))
  98.         ? wp - wcval->chars
  99.         : CCHARW_MAX;
  100.  
  101.     if (wch == NULL) {
  102.         code = len;
  103.     } else if (len >= 0) {
  104.         *attrs = AttrOf(*wcval);
  105.         *color_pair = AttrOf(*wcval) & A_COLOR;
  106.         wmemcpy(wch, wcval->chars, (unsigned) len);
  107.         wch[len] = L'\0';
  108.         code = OK;
  109.     }
  110.     }
  111.  
  112.     TR(TRACE_CCALLS, (T_RETURN("%d"), code));
  113.     return (code);
  114. }
  115.